﻿Imports Microsoft.Office.Interop
''' <summary>
''' Intermedio entre capa presentacion y capa lógica.
''' </summary>
''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
Public Class Gestor

#Region "elias"

    ''' <summary>
    ''' Busca un usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <returns>Datos de un usuario.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Function usuarioBuscar(ByVal p_identificacion As String) As Hashtable
        Dim usuario As Usuario

        usuario = MultiUsuario.buscar(p_identificacion)

        If usuario Is Nothing Then
            Throw New Exception("El usuario no existe.")
        End If

        Return usuario.toHashtable
    End Function

    ''' <summary>
    ''' Verifica si el usuario tiene el permiso indicado.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <param name="p_permiso">Código del permiso.</param>
    ''' <returns>Si el usuario tiene el permiso.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 27/04/2010, Modificado: 27/04/2010</remarks>
    Public Shared Function usuarioTienePermiso(ByVal p_identificacion As String, ByVal p_permiso As Integer) As Boolean
        Dim tiene As Boolean = False

        If p_identificacion <> Nothing Then
            tiene = MultiUsuario.tienePermiso(p_identificacion, p_permiso)
        End If

        Return tiene
    End Function

    ''' <summary>
    ''' Obtiene los datos del usuario actual.
    ''' </summary>
    ''' <returns>Datos del usuario.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Function usuarioActual() As Hashtable
        g_usuario = MultiUsuario.buscar("114320719")
        Return g_usuario.toHashtable
    End Function

#End Region

#Region "David Murillo"

#Region "departamento"

    ''' <summary>
    ''' Registra un departamento
    ''' </summary>
    ''' <param name="p_nombre">Nombre del departamento</param>
    ''' <param name="p_descripcion">Descripción del departamento</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub departamentoRegistrar(ByVal p_nombre As String, ByVal p_descripcion As String)

        MultiDepartamento.registrar(p_nombre, p_descripcion)

    End Sub

    ''' <summary>
    ''' Busca un departamento, puede ser por código o por nombre.
    ''' </summary>
    ''' <param name="p_codigo">Código del departamento</param>
    ''' <param name="p_nombre">Nombre del departamento</param>
    ''' <returns>Lista con los datos de los departamentos</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function departamentoBuscar(ByVal p_codigo As String, ByVal p_nombre As String) As List(Of Hashtable)

        Dim departamentos As List(Of Departamento)
        Dim datosDepartamento As New List(Of Hashtable)

        departamentos = MultiDepartamento.buscar(p_codigo, p_nombre)

        For Each dep As Departamento In departamentos
            datosDepartamento.Add(dep.toHashtable)
        Next

        Return datosDepartamento

    End Function

    ''' <summary>
    ''' Elimina un departamento. Se hace un eliminado lógico. 
    ''' </summary>
    ''' <param name="p_codigo">Código del departamento a eliminar</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function departamentoEliminar(ByVal p_codigo As String) As Boolean

        Dim codNivel As Integer
        Dim codPuesto As Integer

        If Not MultiNivel.listarPorDepartamento(p_codigo).Count = 0 Then

            For Each nivel In MultiNivel.listarPorDepartamento(p_codigo)

                codNivel = nivel.codigo

                If Not MultiPuesto.listarPuestosPorCodigoNivelLP(codNivel).Count = 0 Then

                    For Each puesto In MultiPuesto.listarPuestosPorCodigoNivelLP(codNivel)

                        codPuesto = puesto.Codigo

                        If MultiUsuario.revisarUsuarioEnPuesto(codPuesto) Then

                            Return MultiUsuario.revisarUsuarioEnPuesto(codPuesto)

                        Else
                            MultiDepartamento.eliminar(p_codigo)
                            Return False
                        End If

                    Next

                Else

                    MultiDepartamento.eliminar(p_codigo)
                    Return False

                End If

            Next

        Else

            MultiDepartamento.eliminar(p_codigo)
            Return False

        End If

        Return False

    End Function

    ''' <summary>
    ''' Permite modificar los datos de un departamento
    ''' </summary>
    ''' <param name="p_codigo">Código del departamento</param>
    ''' <param name="p_nombre">Nombre del departamento</param>
    ''' <param name="p_descripcion">Descripción del departamento</param>
    ''' <param name="p_director">Cédula del director(jefe)</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub departamentoModificar(ByVal p_codigo As String, ByVal p_nombre As String, ByVal p_descripcion As String, ByVal p_director As String)

        MultiDepartamento.modificar(p_codigo, p_nombre, p_descripcion, p_director)

    End Sub


#End Region

#Region "cargas Sociales"

    ''' <summary>
    ''' Actualiza las cargas sociales
    ''' </summary>
    ''' <param name="p_ccssPat">Porcentaje a la CCSS</param>
    ''' <param name="p_ccssTrab">Porcentaje de reducción al trabajador</param>
    ''' <param name="p_otrosPat">Otras deducciones al patrono</param>
    ''' <param name="p_otrosTrab">Otras deducciones al trabajador</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub actualizarCargaSocial(ByVal p_ccssPat As Double, ByVal p_ccssTrab As Double, ByVal p_otrosPat As Double, ByVal p_otrosTrab As Double)

        MultiCargasSociales.actualizar(p_ccssPat, p_ccssTrab, p_otrosPat, p_otrosTrab)

    End Sub

    ''' <summary>
    ''' Busca las cargas sociales
    ''' </summary>
    ''' <returns>Lista con los datos de las cargas sociales</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function cargaSocialBuscar() As List(Of Hashtable)

        Dim listaCargaSocial As List(Of CargasSociales)
        Dim datosCargas As New List(Of Hashtable)

        listaCargaSocial = MultiCargasSociales.buscar()

        For Each carga As CargasSociales In listaCargaSocial
            datosCargas.Add(carga.toHashtable)
        Next

        Return datosCargas

    End Function

#End Region

#Region "modificar periodo cv"

    ''' <summary>
    ''' Modifica el periodo de actualización del curriculo vitae
    ''' </summary>
    ''' <param name="p_dias">Cantidad de dias del periodo</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub periodoCVModificar(ByVal p_dias As String)

        MultiConfiguracion.modificarPeriodoCV(p_dias)

    End Sub

    ''' <summary>
    ''' Devuelve el periodo en días para actualizar el currículo vitae.
    ''' </summary>
    ''' <returns>Días</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 22/07/2010, Modificado: 22/07/2010</remarks>
    Public Shared Function curriculoObtenerPeriodoCV() As Integer

        Return MultiConfiguracion.obtenerPeriodoCurriculo()

    End Function

    ''' <summary>
    ''' Convierte un periodo dado en días, la opcion serian dias,meses,años.
    ''' </summary>
    ''' <param name="p_periodo">Periodo</param>
    ''' <param name="p_opcion">Opcion</param>
    ''' <returns>Cantidad en días</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function convertirADias(ByVal p_periodo As String, ByVal p_opcion As String) As Integer

        Dim dias As Integer

        Select Case p_opcion

            Case "Día"

                dias = p_periodo

            Case "Mes"

                dias = p_periodo * 30

            Case "Año"

                dias = p_periodo * 365

        End Select

        Return dias

    End Function

#End Region

#Region "modificar Contrasena"

    ''' <summary>
    ''' Valida la contraseña que el usuario ingresa con la ya almacenada en el sistema
    ''' </summary>
    ''' <param name="p_contrasennaVieja">Contraseña antigua</param>
    ''' <param name="p_contrasennaNueva">Contraseña nueva</param>
    ''' <param name="p_idUsuario">Cédula del usuario</param>
    ''' <returns>True si las contraseñas son iguales, falso si no</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function validarContrasenna(ByVal p_contrasennaVieja As String, ByVal p_contrasennaNueva As String, ByVal p_idUsuario As String) As Boolean

        Dim igual As Boolean = False
        Dim passEncriptado As String
        Dim passUsuario As String

        passEncriptado = Utils.encriptar(p_contrasennaVieja)

        passUsuario = usuarioObtenerContrasenna(p_idUsuario)

        If String.Equals(passUsuario, passEncriptado) = True Then
            igual = True
            Return igual
        Else
            Return igual
        End If

    End Function

    ''' <summary>
    ''' Modifica la contraseña de un usuario
    ''' </summary>
    ''' <param name="p_contrasennaNueva">Contraseña nueva</param>
    ''' <param name="p_id">Cédula del usuario</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub usuarioModificarContrasenna(ByVal p_contrasennaNueva As String, ByVal p_id As String)

        Dim passEncriptado As String

        passEncriptado = Utils.encriptar(p_contrasennaNueva)

        MultiUsuario.modificarContrasenna(passEncriptado, p_id)

    End Sub

    ''' <summary>
    ''' Retorna la contraseña de un usuario
    ''' </summary>
    ''' <param name="p_idUsuario">Cédula del usuario</param>
    ''' <returns>Contraseña encriptada del usuario</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Function usuarioObtenerContrasenna(ByVal p_idUsuario As String) As String

        Dim passUsuario As String

        passUsuario = MultiUsuario.obtenerContrasenna(p_idUsuario)

        Return passUsuario

    End Function



#End Region

#Region "recuperar contrasena"

    ''' <summary>
    ''' Obtiene la fecha de nacimiento de un usuario
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario</param>
    ''' <returns>Fecha de nacimiento</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioObtenerFechaNac(ByVal p_nombreUsuario As String) As Date

        Dim fechaNac As Date

        fechaNac = MultiUsuario.obtenerFechaNacimiento(p_nombreUsuario)

        Return fechaNac

    End Function

    ''' <summary>
    ''' Retorna el correo electrónico de un usuario
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario</param>
    ''' <returns>Correo electronico</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioObtenerCorreo(ByVal p_nombreUsuario As String) As String

        Dim correo As String

        correo = MultiUsuario.obtenerCorreo(p_nombreUsuario)

        Return correo

    End Function

    ''' <summary>
    ''' Genera los datos que va a tener el correo electrónico de recuperar la contraseña
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre del usuario</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub usuarioRecuperarContrasenna(ByVal p_nombreUsuario As String)

        Dim asunto As String
        Dim contenido As String
        Dim contrasennaNueva As String
        Dim contrasennaEncrip As String

        contrasennaNueva = generarContrasenna()

        asunto = "Recuperación de contraseña sistema OpenRH"
        contenido = "Este correo a sido enviado por el administrador del sistema OpenRH " & vbCrLf & _
        "Su nueva contraseña del sistema es: " & contrasennaNueva

        enviarCorreo(asunto, contenido, p_nombreUsuario)
        contrasennaEncrip = Utils.encriptar(contrasennaNueva)
        MultiUsuario.actualizarContrasenna(contrasennaEncrip, p_nombreUsuario)

    End Sub

    ''' <summary>
    ''' Envia un correo al usuario
    ''' </summary>
    ''' <param name="p_asunto">Asunto del correo</param>
    ''' <param name="p_contenido">Contenido del correo</param>
    ''' <param name="p_nombreUsuario">Nombre del usuario</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Sub enviarCorreo(ByVal p_asunto As String, ByVal p_contenido As String, ByVal p_nombreUsuario As String)

        Dim SMTP As String = "smtp.gmail.com"
        Dim usuarioCorreo As String = "rrhh.utecnologica@gmail.com"
        Dim contrasennaCorreo As String = "softca2010"
        Dim puerto As Integer = "587"

        Dim correoUsuario As String
        Dim contenido As String
        Dim asunto As String

        correoUsuario = usuarioObtenerCorreo(p_nombreUsuario)
        asunto = p_asunto
        contenido = p_contenido

        Dim correo As New System.Net.Mail.MailMessage()
        correo.From = New System.Net.Mail.MailAddress(usuarioCorreo)
        correo.Subject = asunto
        correo.To.Add(correoUsuario)
        correo.Body = contenido

        Dim servidor As New System.Net.Mail.SmtpClient
        servidor.Host = SMTP
        servidor.Port = puerto
        servidor.EnableSsl = True
        servidor.Credentials = New System.Net.NetworkCredential(usuarioCorreo, contrasennaCorreo)

        Try
            servidor.Send(correo)
        Catch
            Throw New Exception("Correo no enviado debido a problemas de conexión.")
        End Try

    End Sub

    ''' <summary>
    ''' Genera una contraseña
    ''' </summary>
    ''' <returns>Contraseña</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Function generarContrasenna() As String

        Dim contrasenna As String

        contrasenna = New Random().Next(10000, 1000000)

        Return contrasenna

    End Function




#End Region

#Region "usuario"

    ''' <summary>
    ''' Verifica si el nombre de usuario ya existe en el sistema
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario</param>
    ''' <returns>True si existe, false si no</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioExisteNombreUsuario(ByVal p_nombreUsuario As String) As Boolean

        Return MultiUsuario.existeNombreUsuario(p_nombreUsuario)

    End Function

    ''' <summary>
    ''' Busca todos los directores(jefes)
    ''' </summary>
    ''' <returns>Lista con los datos de los directores</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioBuscarDirectores() As List(Of Hashtable)

        Dim directores As New List(Of Hashtable)
        Dim directorHash As Hashtable
        Dim listaDirectores As List(Of Usuario)

        listaDirectores = MultiUsuario.buscarDirectores

        For Each dir As Usuario In listaDirectores
            directorHash = dir.toHashtable
            directores.Add(directorHash)
        Next

        Return directores

    End Function


#End Region

#Region "curriculo"

    ''' <summary>
    ''' Obtiene el currículo del usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <returns>Currículo del usuario.</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioObtenerCurriculo(ByVal p_identificacion As String) As Word.Document
        Return MultiUsuario.obtenerCurriculo(p_identificacion)
    End Function

    ''' <summary>
    ''' Subir de prueba
    ''' </summary>
    ''' <param name="p_curriculo"></param>
    ''' <remarks></remarks>
    Public Shared Sub subirCurriculo(ByVal p_curriculo As String)

        Dim curriculo() As Byte

        curriculo = Utils.object2Byte(p_curriculo)

        MultiUsuario.subirCurriculo(curriculo)

    End Sub

#End Region

#End Region

End Class
